package org.fly.jingwei.dao;

import org.fly.jingwei.entity.SlaveUserRelationEntity;
import org.fly.jingwei.entity.TaskUserRelationEntity;
import org.fly.jingwei.entity.UserGroupAttributeEntity;
import org.fly.jingwei.entity.UserGroupEntity;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author leo.jie (weixiao.me@aliyun.com)
 * @version 1.0
 * @organization bigdata
 * @website https://www.jielongping.com
 * @date 2020/5/29 11:07 下午
 * @since 1.0
 */
@Repository
public interface UserGroupDao {
    /**
     * 分页形式查询用户组
     *
     * @param start 开始页
     * @param limit 限制条数
     * @param groupName  用户组名称
     * @return 用户组列表
     */
    List<UserGroupEntity> selectUserGroupByPage(int start, int limit, String groupName);

    /**
     * 查询所有用户组
     * @return 所有用户组
     */
    List<UserGroupEntity> allUserGroup();

    /**
     * 查询用户组的总数量
     * @param userGroupName 用户组名称
     * @return 所选条件下的用户组总数
     */
    Integer userGroupCount(String userGroupName);

    /**
     * 根据用户组名查询当前用户组下的所有用户
     * @param userGroupName 用户组名
     * @return 所有用户
     */
    List<UserGroupAttributeEntity> getUsersByUserGroupName(String userGroupName);

    /**
     * 根据用户名查询当前用户的权限相关信息
     * @param username 用户名
     * @return 用户相关权限信息
     */
    UserGroupAttributeEntity getInfoByUsername(String username);

    /**
     * 根据用户组名获取当前用户可见的任务组
     * @param userGroupName 用户组名
     * @return 任务组
     */
    List<TaskUserRelationEntity> getTaskGroupsByUserGroupName(String userGroupName);

    /**
     * 根据用户组名获取当前用户可见的节点
     * @param userGroupName 用户组名
     * @return 节点用户关系
     */
    List<SlaveUserRelationEntity> getSlavesByUserGroupName(String userGroupName);

    /**
     * 添加用户组
     * @param userGroup 添加用户组
     */
    void addUserGroup(UserGroupEntity userGroup);

    /**
     * 添加用户组成员表(即添加该用户组下有哪些用户)
     * @param attributes 用户组
     */
    void addUserGroupAttribute(UserGroupAttributeEntity attributes);

    /**
     * 添加用户组可见的节点记录
     * @param entry 用户组和节点关系实体
     */
    void addUserSlaveRelation(SlaveUserRelationEntity entry);

    /**
     * 添加用户组可见的任务组记录
     * @param entry 用户组和任务关系实体
     */
    void addTaskUserRelation(TaskUserRelationEntity entry);

    /**
     * 修改用户组
     * @param userGroup 用户组实体
     */
    void updateUserGroup(UserGroupEntity userGroup);

    /**
     * 删除用户组
     * @param name 用户组名
     */
    void deleteUserGroupByName(String name);

    /**
     * 删除用户组下的所有用户
     * @param name 用户组名
     */
    void deleteUserAttributeByGroupName(String name);

    /**
     * 删除用户组下可见的节点记录
     * @param name 用户组名
     */
    void deleteSlaveRelationByGroupName(String name);

    /**
     * 删除用户组下可见的任务组记录
     * @param name 用户组名
     */
    void deleteTaskRelationByGroupName(String name);

    /**
     * 根据用户组名或者用户id查找用户组
     * @param name 用户组名
     * @param id 用户ID
     * @return 用户组
     */
    UserGroupEntity selectUserGroupByNameOrId(String name, Integer id);

    /**
     * 修改用户组在其它关系表中的用户组名
     * @param tableName 表名
     * @param oldName 原有名
     * @param newName 新名字
     */
    void updateUserGroupNameForRelation(String tableName, String oldName, String newName);

    /**
     * 根据用户名修改用户组与用户的关联表
     * @param attr 用户组与用户的关联表
     */
    void updateUserGroupAttrByName(UserGroupAttributeEntity attr);

    /**
     * 根据用户名删除用户用户成员表中的记录
     * @param username 用户名
     */
    void deleteUserAttributeByName(String username);
}
